/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：呼叫中心-系统通用工具封装层
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taiping.cc.application.commons;

import com.alibaba.druid.filter.config.ConfigTools;
import com.google.common.collect.ImmutableList;
import com.taipingframework.boot.web.pojo.KeyValuePair;
import com.taipingframework.utility.exception.UtilityException;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 加密/解密
 * （1）阿里巴巴数据源核心包，对jdbc连接密码进行加密保护。
 * （2）最底部是配置示例。
 */
@Slf4j
public class SecurityCommon {
//CHECKSTYLE:OFF

    /**
     * 加密配置信息属性值
     *
     * @param message 明文属性值
     * @return 返回 公钥/私钥/密文属性值
     */
    public static List<KeyValuePair> encrypt(String message) throws UtilityException {
        try {
            String[] keys = ConfigTools.genKeyPair(512);
            String secretTest = ConfigTools.encrypt(keys[0], message);
            return ImmutableList.of(
                    new KeyValuePair("privateKey", keys[0]),
                    new KeyValuePair("publicKey", keys[1]),
                    new KeyValuePair("password", secretTest)
            );
        } catch (Exception e) {
            throw new UtilityException(e);
        }
    }

    /**
     * 使用公钥对密文执行解密操作
     *
     * @param secretMessage 密文
     * @param publicKey     公钥
     */
    public static String decrypt(String secretMessage, String publicKey) throws UtilityException {
        try {
            return ConfigTools.decrypt(publicKey, secretMessage);
        } catch (Exception e) {
            throw new UtilityException(e);
        }
    }

//CHECKSTYLE:ON
}

/*    #
 *    # 数据库 配置示例
 *    #
 *    spring.datasource.druid.driver-class-name=oracle.jdbc.OracleDriver
 *    spring.datasource.druid.url=${jdbc.url}
 *    spring.datasource.druid.username=${jdbc.user}
 *    spring.datasource.druid.password=${jdbc.password.sms}
 *    #数据库加密配置 不加密可忽略  加密文档 https://github.com/alibaba/druid/wiki/如何在Spring-Boot中配置数据库密码加密？
 *    spring.datasource.druid.connection-properties=\
 *      druid.stat.mergeSql=true;\
 *      druid.stat.slowSqlMillis=1000;\
 *      config.decrypt=true;\
 *      config.decrypt.key=${jdbc.password.sms.dbKey}
 *    #密码加密需开启该参数配置
 *    spring.datasource.druid.filter.config.enabled=true
 **/
